package com.gitee.chili.leisure.game;

import com.gitee.chili.leisure.domain.dto.SpecialCards;
import com.gitee.chili.leisure.enums.CardType;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 麻将
 *
 * @author week solider
 * @since 2020-07-06
 */

@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class MahjongPlayer extends Player {

    /**
     * 定缺 (如: 血战、血流需要缺一门才能胡牌) 1:万, 2:条, 3:筒
     */
    private CardType useless = CardType.undefined;

    /**
     * 是否已经胡牌 1:是, 0:否
     */
    private boolean wined;

    /**
     * 色子 1
     */
    private int diceFirst;

    /**
     * 色子 2
     */
    private int diceSecond;

    /**
     * 是否听牌
     */
    private boolean readyHand;

    // ------------------------------------------  实时更新字段 begin

    /**
     * 是否可以杠
     */
    private boolean kong;

    /**
     * 是否可以碰
     */
    private boolean pong;

    /**
     * 是否可以胡
     */
    private boolean winning;

    /**
     * 打出能听的牌 (手牌中必须包含)
     * 每次都会更新，不涉及到 add 操作
     */
    private List<Integer> discardCanReadyHand;

    // ------------------------------------------ 实时更新字段 end

    /**
     * 换三张的牌
     */
    private List<Integer> exchange = new ArrayList<>();

    /**
     * 显示在台面的牌
     */
    private List<SpecialCards> specialCards = new ArrayList<>();

    /**
     * 听牌信息 （键为听牌，值为番数）
     */
    private Map<Integer, Integer> readyHandMap = new HashMap<>();

    /**
     * 胡牌信息 （键为胡牌，值为番数）
     */
    private Map<Integer, Integer> winMap = new HashMap<>();

    @Override
    protected void draw0(Integer card) {
        if (handsCards == null) {
            synchronized (this) {
                if (handsCards == null) {
                    handsCards = new ArrayList<>(13);
                }
            }
        }
        handsCards.add(card);
    }

    @Override
    protected void discard0(Integer card) {
        if (discard == null) {
            synchronized (this) {
                if (discard == null) {
                    discard = new ArrayList<>(80);
                }
            }
        }
        handsCards.remove(card);
        discard.add(card);
    }

    @Override
    public Long getType() {
        return 1L;
    }

    /**
     * 获取摸到的牌
     */
    public Integer getLastCard() {
        return handsCards.get(handsCards.size() - 1);
    }
}
